package GUI;

import Interaction.ServerConnection;
import java.rmi.RemoteException;
import Flightadministration.*;
import Data.*;
import Report.Report;
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.table.DefaultTableModel;
import javax.swing.DefaultComboBoxModel;
import java.awt.CardLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Vector;
import javax.swing.table.DefaultTableModel;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;

/**
 *
 * @author David Ponce
 * @author Philipp Armbruster
 */
public class BookingManage extends JPanel {

    final Main td;
    private JPanel jp;
    public DefaultTableModel model;
    public JTable table;
    public Vector<String> columnNames;
    public Vector<Vector> rowData;
    public Vector<String> allFlightRInformations;
    public DefaultComboBoxModel model1;
    public JComboBox comboBox1;
    public Report r = new Report();
    /*Das AdministrationsObjekt, welches über die getConnection methode vom RMI Server geholt wird, dem "admin" objekt zugewiesen.
    *Dadurch ist eine Kommunikation zwischen GUI und Applikationsserver mittels RMI möglich*/
    final Flightadministration admin = ServerConnection.getConnection();


    // Konstruktor
    public BookingManage(final Main td) throws java.rmi.RemoteException {

        this.td = td;
        showBookingManage();
    }


    // Methoden
    public void showBookingManage() throws RemoteException{

        jp = new JPanel();

        //GridBagLayout
        //**********************************************************************

        GridBagLayout gbl = new GridBagLayout();
        jp.setLayout(gbl);
        jp.setBackground(Color.white);

        GridBagConstraints constraints = new GridBagConstraints();

        constraints.fill = GridBagConstraints.HORIZONTAL;   // wie Komponente Bereich füllen soll
        constraints.weightx = 1;                     // Breite
        constraints.weighty = 1;                    // Höhe
        constraints.insets = new Insets(0,0,1,1);   // Abstände definieren


        //Label & ComboBox
        //**********************************************************************

        JLabel headline = new JLabel("<html><h2 color=blue>Buchungen verwalten</h2></html>");
        headline.setHorizontalAlignment(JLabel.CENTER);
        constraints.gridx = 0;
        constraints.gridy = 0;
        constraints.gridwidth = 3;
        jp.add(headline, constraints);

        // FlightRealizations
        JLabel label1 = new JLabel("Flugdurchführung auswählen: ");
        constraints.gridx = 0;
        constraints.gridy = 1;
        constraints.gridwidth = 1;
        jp.add(label1, constraints);

        // Vector mit Informationen zu allen FLugdurchführungen aus der Datenbank befüllen
        allFlightRInformations = admin.getAllFlightRealizationInfosForComboBox();
        // Neues Model für die ComboBox erzeugen und die Fluginformationen übergeben
        model1 = new DefaultComboBoxModel(allFlightRInformations);

        comboBox1 = new JComboBox();
        comboBox1.setModel(model1);
        constraints.gridx = 1;
        constraints.gridy = 1;
        constraints.gridwidth = 2;
        jp.add(comboBox1, constraints);


        //JTable
        //**********************************************************************

        // Vector erzeugen und die Bezeichnungen der Tabellenspalten hinzufügen
        columnNames = new Vector<String>();
            columnNames.add("Buchungsnr.");
            columnNames.add("Flugnr.");
            columnNames.add("Passagiernr.");
            columnNames.add("Passagiername");
            columnNames.add("Check-in-Datum");
            columnNames.add("Sitzplatz");

        // Vector erzeugen und mit Daten aus Datenbank befüllen
        rowData = admin.getAllBookingsForTable();

        model = new DefaultTableModel( rowData, columnNames );
        model.addTableModelListener(table);
        table = new JTable(model) {
            public boolean isCellEditable(int x, int y) {
                return false;
            }
        };
        table.setModel(model);
        table.setAutoCreateRowSorter(true);
        table.getColumnModel().getColumn(0).setPreferredWidth(10);
        table.getColumnModel().getColumn(1).setPreferredWidth(10);
        table.getColumnModel().getColumn(2).setPreferredWidth(5);
        constraints.gridx = 0;
        constraints.gridy = 2;
        constraints.gridwidth = 3;
    //    constraints.fill = GridBagConstraints.HORIZONTAL;
    //    constraints.weighty = 1.0;
        table.setPreferredScrollableViewportSize(new Dimension(550,450));
        table.setVisible(true);
        jp.add( new JScrollPane(table), constraints);


        //Buttons
        //**********************************************************************

        JButton button_CreateBooking = new JButton("Buchung anlegen");
        constraints.gridwidth = 1;
        constraints.gridx = 0;
        constraints.gridy = 3;
        jp.add(button_CreateBooking, constraints);

        JButton checkIn = new JButton("Check-in durchführen");
        constraints.gridwidth = 1;
        constraints.gridx = 1;
        constraints.gridy = 3;
        jp.add(checkIn, constraints);

        JButton cancel = new JButton("Buchung stornieren");
        constraints.gridwidth = 1;
        constraints.gridx = 2;
        constraints.gridy = 3;
        jp.add(cancel, constraints);


        //Action Listener
        //**********************************************************************

        comboBox1.addActionListener(new ActionListener() {
                @Override
            public void actionPerformed(ActionEvent e) {
                // Abfragen ob Standardwert ausgewählt ist
                if (comboBox1.getSelectedItem().equals("Wählen Sie hier eine Flugdurchführung aus, um nur deren Buchungen anzuzeigen")) {
                    try {
                        updateTableData();
                    } catch (RemoteException ex) {
                        System.out.println(ex);
                    }
                }
                else {
                    // Wenn nicht, aktuelle FlightRealization aus ComboBox auslesen und Informationen dazu in Label anzeigen
                    JComboBox cb = (JComboBox)e.getSource();
                    Object chosenFlightRealization = cb.getSelectedItem();
                        String chosenFlightRAsString = String.valueOf(chosenFlightRealization);
                            int index2 = chosenFlightRAsString.indexOf(",");
                            int chosenFlightRId = Integer.parseInt(chosenFlightRAsString.substring(5, index2));

                                try {
                                    rowData = admin.getAllBookingsByRealizationIdForTable(chosenFlightRId);

                                    model.setDataVector(rowData, columnNames);

                                } catch (RemoteException ex) {
                                    System.out.println(ex);
                                }
                }
            }
        });


        button_CreateBooking.addActionListener(new ActionListener() {
                @Override
            public void actionPerformed(ActionEvent e){
                ((CardLayout) td.rightp.getLayout()).show(td.rightp, "BookingC");
            }
        });


        checkIn.addActionListener(new ActionListener() {
                @Override
            public void actionPerformed(ActionEvent e) {
                if (table.getSelectedRow()==-1) {
                    JOptionPane.showMessageDialog(null, "Bitte wählen Sie eine Tabellenzeile aus!");
                }
                else {
                    try {
                        // BookingId und realizationId der ausgewählten Tabellenzeile auslesen
                        int iSelectedRow = table.getSelectedRow();

                        Object currentBookingId = table.getModel().getValueAt(iSelectedRow, 0);
                            int bookingId = Integer.parseInt(String.valueOf(currentBookingId));

                        Object currentRealizationId = table.getModel().getValueAt(iSelectedRow, 1);
                            int realizationId = Integer.parseInt(String.valueOf(currentRealizationId));

                        // Check-in durchführen und JTable aktualisieren
                        admin.checkIn(bookingId, realizationId);

                        td.updateBooking();

                        JOptionPane.showMessageDialog(null, "Check-in erfolgreich durchgeführt");

                    } catch (RemoteException ex) {
                        System.out.println(ex);
                    }
                }
            }
        });
        

        cancel.addActionListener(new ActionListener() {
                @Override
            public void actionPerformed(ActionEvent e){
                if (table.getSelectedRow()==-1) {
                    JOptionPane.showMessageDialog(null, "Bitte wählen Sie eine Tabellenzeile aus!");
                }
                else if (table.getModel().getValueAt(table.getSelectedRow(), 5).equals("Noch kein Sitzplatz")) {

                        try {
                            // Ausgewählte Zeile auslesen
                            int chosenBooking = table.getSelectedRow();
                            // Ausgewählte Buchungsnummer auslesen
                            Object currentBookingId = table.getModel().getValueAt(chosenBooking, 0);
                                int currentBookingIdAsInt = Integer.parseInt(String.valueOf(currentBookingId));
                            // Ausgewählte Flugnummer auslesen
                            Object currentRealizationId = table.getModel().getValueAt(chosenBooking, 1);
                                int currentRealizationIdAsInt = Integer.parseInt(String.valueOf(currentRealizationId));
                            // Ausgewählte Kundennummer auslesen
                            Object currentPassangerId = table.getModel().getValueAt(chosenBooking, 2);
                                int currentPassangerIdAsInt = Integer.parseInt(String.valueOf(currentPassangerId));

                            // Buchungsobjekt aus Datenbank löschen
                            admin.deleteBooking(currentBookingIdAsInt, currentPassangerIdAsInt, currentRealizationIdAsInt);
                                // JTables aktualisieren
                                td.updateBooking();

                            JOptionPane.showMessageDialog(null, "Buchung gelöscht!");

                        } catch (RemoteException ex) {
                            System.out.println(ex);
                        }
                     }
                     else {

                        JOptionPane.showMessageDialog(null, "<html><p style=\"color:red; text-align: center\">" + 
                                                            "Da dieser Passagier bereits eingecheckt hat,<br>" +
                                                            "kann seine Buchung nicht mehr gelöscht werden</p></html>");
                    }
            }
        });

    }

    public void updateTableData() throws RemoteException {

        // Vector mit Daten für JTable belegen
        rowData = admin.getAllBookingsForTable();

        // Tabelleninhalt wird aktualisiert
        model.setDataVector(rowData, columnNames);
    }

    public JPanel getJp() {
        return jp;
    }
}